package com.ecric.sensor;

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;

import java.util.Iterator;
import java.util.List;

public class SensorActivity extends AppCompatActivity implements SensorEventListener {

    private SensorManager sm;
    /**加速传感器*/
    private Sensor accelerometer;
    /**磁场传感器*/
    private Sensor magnetic_field;
    /**方向传感器*/
    private Sensor orientation;
    /**陀螺仪传感器*/
    private Sensor gyroscope ;
    /** 光传感器*/
    private Sensor light ;
    /** 温度传感器*/
    private Sensor temperature ;
    /** 压力传感器*/
    private Sensor pressure ;
    private TextView txt_acc;



    private SensorEventListener accListener  = new SensorEventListener() {
        /**
         * 值发生变化时触发
         * @param event
         */
        @Override
        public void onSensorChanged(SensorEvent event) {
            float[] values = event.values;
            StringBuilder sb = new StringBuilder();
            sb.append("加速传感器示例--------->")
                    .append("\nX 方向上的加速度 ：")
                    .append(values[0])
                    .append(" \nY 方向上的加速度 ：")
                    .append(values[1])
                    .append("\nZ 方向上的加速度 ：")
                    .append(values[2]);
            txt_acc.setText(sb.toString());
        }

        /**
         * 精度发生变化时触发
         * @param sensor
         * @param accuracy
         */
        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {

        }

    };


    private SensorEventListener orientationListener  = new SensorEventListener() {
        @Override
        public void onSensorChanged(SensorEvent event) {
            float[] values = event.values;
            StringBuilder sb = new StringBuilder();
            sb.append("方向传感器示例--------->")
                    .append("\nX 方向 ：")
                    .append(values[0])
                    .append("\nY 方向 ：")
                    .append(values[1])
                    .append("\nZ 方向 ：")
                    .append(values[2]);
            txt_or.setText(sb.toString());
        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {

        }
    };

    private SensorEventListener temperatureListener = new SensorEventListener() {
        @Override
        public void onSensorChanged(SensorEvent event) {
            //获取传感器的类型
            if (event.sensor.getType() == Sensor.TYPE_AMBIENT_TEMPERATURE){
                float[] values = event.values;
                StringBuilder sb = new StringBuilder();
                sb.append("温度传感器示例--------->")
                        .append("\n当前温度：")
                        .append(values[0]).append("℃");
                txt_tem.setText(sb.toString());
            }

        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {

        }
    };


    private TextView txt_or;
    private TextView txt_tem;
    private List<Sensor> deviceSensors;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sensor);

        txt_acc = (TextView) findViewById(R.id.txt_acc);
        txt_or = (TextView) findViewById(R.id.txt_or);
        txt_tem = (TextView) findViewById(R.id.txt_tem);

        // 1⃣️ 获取传感器管理服务
        sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        // 2⃣️ 获取指定类型的传感器
        //获取手机上支持的所有传感器
        deviceSensors = sm.getSensorList(Sensor.TYPE_ALL);


        accelerometer = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        magnetic_field = sm.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
        orientation = sm.getDefaultSensor(Sensor.TYPE_ORIENTATION);
        gyroscope  = sm.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
        light  = sm.getDefaultSensor(Sensor.TYPE_LIGHT);
        if (!check(Sensor.TYPE_AMBIENT_TEMPERATURE) && !check(Sensor.TYPE_TEMPERATURE)){
            Toast.makeText(this, "当前设备不支持温度传感器!", Toast.LENGTH_SHORT).show();
        }
        temperature  = sm.getDefaultSensor(Sensor.TYPE_AMBIENT_TEMPERATURE);
        pressure  = sm.getDefaultSensor(Sensor.TYPE_PRESSURE);


    }


    @Override
    protected void onResume() {
        super.onResume();
        /**
         * 在Activity 的onResume给传感器注册监听
         * 参数一：listener 传感器监听器，要实现 {@link SensorEventListener}  接口
         * 参数二：sensor 传感器对象
         * 参数三：rate 获取传感器数据的频率  如下：
         * SensorManager.SENSOR_DELAY_FASTEST： 最快，延迟最小 ，但耗电量大，
         *     只用特别依赖传感器的应用才会采用这种频率，由于传递的是原始数据，算法处理不好，将会影响应用的性能
         * SensorManager.SENSOR_DELAY_GAME  :   适合游戏的频率，一般实时性的要求适合这种频率
         * SensorManager.SENSOR_DELAY_NORMAL : 正常频率 一般对于实时性要求不是太高的应用适合这种频率
         * SensorManager.SENSOR_DELAY_UI : 适合普通页面的频率 ，这中比较省电，系统开销小，但延迟比较大适合小程序应用
         *
         */
        sm.registerListener(this,accelerometer,SensorManager.SENSOR_DELAY_UI);
        sm.registerListener(this,orientation,SensorManager.SENSOR_DELAY_FASTEST);
        sm.registerListener(this,temperature,SensorManager.SENSOR_DELAY_UI);

    }

    /**
     * 检测设备是否支持某类型的传感器
     * @param type 传感器的类型
     * @return true  当前设备支持该类型的传感器  否则不支持
     */
    private boolean check(int type){
        Iterator<Sensor> iterator = deviceSensors.iterator();
        while (iterator.hasNext()){
            Sensor sensor = iterator.next();
            if (sensor.getType() == type){
                return true;
            }
        }
        return false;
    }


    @Override
    protected void onStop() {
        super.onStop();
        sm.unregisterListener(this);
        sm.unregisterListener(this);
        sm.unregisterListener(this);
    }


    @Override
    public void onSensorChanged(SensorEvent event) {
        float[] values = event.values;
        StringBuilder sb;
        switch (event.sensor.getType()){
            case Sensor.TYPE_ACCELEROMETER:
                 sb = new StringBuilder();
                sb.append("加速传感器示例--------->")
                        .append("\nX 方向上的加速度 ：")
                        .append(values[0])
                        .append(" \nY 方向上的加速度 ：")
                        .append(values[1])
                        .append("\nZ 方向上的加速度 ：")
                        .append(values[2]);
                txt_acc.setText(sb.toString());
            break;
            case Sensor.TYPE_ORIENTATION:
                sb = new StringBuilder();
                sb.append("方向传感器示例--------->")
                        .append("\n 绕Z轴旋转的角度 ：")
                        .append(values[0])
                        .append("\n 绕X轴旋转的角度 ：")
                        .append(values[1])
                        .append("\n 绕Y轴旋转的角度 ：")
                        .append(values[2]);
                txt_or.setText(sb.toString());
            break;
        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }
}
